package com.zhiwen.service;

import com.zhiwen.domain.event.NotificationEvent;

import java.util.List;

/**
 * 通知消息生产者接口
 */
public interface NotificationProducer {

    /**
     * 发送问题回答通知
     *
     * @param questionId 问题ID
     * @param answerId   回答ID
     * @param receiverId 接收者ID
     * @param senderId   发送者ID
     */
    void sendQuestionAnsweredNotification(Long questionId, Long answerId, Long receiverId, Long senderId);

    /**
     * 发送回答评论通知
     *
     * @param answerId   回答ID
     * @param commentId  评论ID
     * @param receiverId 接收者ID
     * @param senderId   发送者ID
     */
    void sendAnswerCommentedNotification(Long answerId, Long commentId, Long receiverId, Long senderId);

    /**
     * 发送回答被采纳通知
     *
     * @param questionId 问题ID
     * @param answerId   回答ID
     * @param receiverId 接收者ID
     * @param senderId   发送者ID
     */
    void sendAnswerAcceptedNotification(Long questionId, Long answerId, Long receiverId, Long senderId);

    /**
     * 发送内容审核通知
     *
     * @param contentType  内容类型（1-问题，2-回答，3-评论）
     * @param contentId    内容ID
     * @param receiverId   接收者ID
     * @param reviewResult 审核结果
     * @param remark       备注
     */
    void sendContentReviewedNotification(Integer contentType, Long contentId, Long receiverId, Integer reviewResult, String remark);

    /**
     * 发送系统通知
     *
     * @param title      标题
     * @param content    内容
     * @param receiverId 接收者ID（为null时发送给所有用户）
     */
    void sendSystemNotification(String title, String content, Long receiverId);

    /**
     * 发送系统通知给多个用户
     *
     * @param title       标题
     * @param content     内容
     * @param receiverIds 接收者ID列表
     */
    void sendSystemNotificationToMultiUsers(String title, String content, List<Long> receiverIds);

    /**
     * 发送内容点赞通知
     *
     * @param contentType 内容类型（1-问题，2-回答，3-评论）
     * @param contentId   内容ID
     * @param receiverId  接收者ID
     * @param senderId    点赞者ID
     */
    void sendContentLikedNotification(Integer contentType, Long contentId, Long receiverId, Long senderId);

    /**
     * 发送用户关注通知
     *
     * @param receiverId 被关注者ID
     * @param senderId   关注者ID
     */
    void sendUserFollowedNotification(Long receiverId, Long senderId);

    /**
     * 发送自定义通知事件
     *
     * @param event 通知事件
     */
    void sendNotificationEvent(NotificationEvent event);

    /**
     * 批量发送通知事件
     *
     * @param events 通知事件列表
     */
    void sendBatchNotificationEvents(List<NotificationEvent> events);
}
